package com.shihb.chapter03oop

/**
 * scala的覆写字段
 * 知识前提,java的字段隐藏和动态绑定机制
 */
object Demo05OverrideField {

  def main(args: Array[String]): Unit = {
    val a: A = new B
    val b = new B
    //看着是访问属性,实际都是访问方法,scala底层属性都是私有的，不可能被访问
    //实际调用a.age(),b.age()
    //由于动态绑定机制,方法和内存地址绑定,两个调用的都是B的age()方法
    println(a.age, b.age)
    // 如果要访问A你只能绑定A的地址
    println((new A).age)
    println(a.name)
  }
}

class A {
  val age: Int = 10;
  def name: String ={
    "wyh"
  }

}

class B extends A {
  //覆写要写关键字
  // val 能重写一个val属性
  override val age: Int = 20;
  //或者重写不带参数的同名方法,这里会生成name()方法
  override val name: String = "shb";

}
// C有个抽象字段name
// 1、 抽象的字段(属性),就是没有被初始化的字段
// 2、 当一个类含有抽象属性是，着该属性需要标记成抽象
// 3、 抽象属性，底层不生成属性声明，而是生成两个方法name() name_$eq
abstract  class C{
  var name:String
}

class SubC extends C{
  //1、如果我们在子类取重写父类的抽象属性，本质是实现了抽象方法
  //2、因此这里override可写可不写
  override var name: String = _
}
